#ifndef AODV_TYPES_H
#define AODV_TYPES_H

#include <stdint.h> // For uint8_t, uint32_t

// AODV消息类型枚举
typedef enum {
    AODV_RREQ,  // Route Request
    AODV_RREP,  // Route Reply
    AODV_RERR,  // Route Error
    AODV_HELLO, // Hello Message
    AODV_DATA   // Data Packet (for application data)
} aodv_msg_type;

// AODV消息头
typedef struct {
    aodv_msg_type type;
    // 其他通用字段，例如：
    // uint32_t source_addr;
    // uint32_t dest_addr;
    // uint32_t sequence_num; // 消息序列号，用于防止重复处理
} aodv_header;

// RREQ消息结构
typedef struct {
    aodv_header header;
    uint32_t rreq_id;           // RREQ ID
    uint32_t dest_addr;         // 目的地址
    uint32_t dest_seq_num;      // 目的序列号
    uint32_t orig_addr;         // 源地址
    uint32_t orig_seq_num;      // 源序列号
    uint8_t hop_count;          // 跳数
    // 其他标志位，例如：
    // uint8_t flags;
} aodv_rreq;

// RREP消息结构
typedef struct {
    aodv_header header;
    uint32_t dest_addr;         // 目的地址
    uint32_t dest_seq_num;      // 目的序列号
    uint32_t orig_addr;         // 源地址
    uint32_t orig_seq_num;      // 源序列号
    uint8_t hop_count;          // 跳数
    uint32_t lifetime;          // 路由生命周期
    // 其他标志位
} aodv_rrep;

// RERR消息结构
typedef struct {
    aodv_header header;
    uint8_t dest_count;         // 目的地址数量
    // 变长数组，存储不可达目的地的地址和序列号
    // struct {
    //     uint32_t unreachable_dest_addr;
    //     uint32_t unreachable_dest_seq_num;
    // } unreachable_nodes[dest_count]; // 这是一个示例，实际实现需要动态分配或使用指针
} aodv_rerr;

// Hello消息结构
typedef struct {
    aodv_header header;
    uint32_t lifetime;          // Hello消息的生命周期
} aodv_hello;

// 数据包结构
#define MAX_PAYLOAD_SIZE 1024 // 假设最大数据载荷大小
typedef struct {
    aodv_header header; // 可以包含源/目的地址等
    uint32_t payload_len; // 数据长度
    char payload[MAX_PAYLOAD_SIZE]; // 实际数据
} aodv_data_packet;

// 路由表条目
typedef struct {
    uint32_t dest_addr;         // 目的地址
    uint32_t dest_seq_num;      // 目的序列号
    uint32_t next_hop_addr;     // 下一跳地址
    uint8_t hop_count;          // 跳数
    uint32_t lifetime;          // 路由条目生命周期
    // 其他状态，例如：
    // bool valid;               // 路由是否有效
    // uint32_t last_used_time;  // 最后使用时间
} routing_table_entry;

// 邻居列表条目
typedef struct {
    uint32_t neighbor_addr;     // 邻居地址
    uint32_t last_hello_time;   // 最后收到Hello消息的时间
    // 其他状态，例如：
    // bool active;              // 邻居是否活跃
} neighbor_list_entry;

// 节点上下文
typedef struct {
    uint32_t node_addr;         // 当前节点的地址
    uint32_t current_seq_num;   // 当前节点的序列号
    // 路由表 (可以使用链表、哈希表等数据结构)
    // routing_table_entry *routing_table;
    // 邻居列表 (可以使用链表、哈希表等数据结构)
    // neighbor_list_entry *neighbor_list;
    // RREQ ID (用于生成唯一的RREQ ID)
    uint32_t rreq_id_counter;
    // 其他计时器、缓冲区等
} aodv_node_context;

#endif // AODV_TYPES_H